package com.zpark.sports.service.impl;

import com.zpark.sports.mapper.IUserMapper;
import com.zpark.sports.pojo.BasketballMallUser;
import com.zpark.sports.service.IUserService;
import com.zpark.sports.service.exception.*;
import com.zpark.sports.utils.MD5Utils;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Date;
import java.util.UUID;

/**
 * @PackageName: com.zpark.sports.service.impl
 * @ClassName: UserServiceImpl
 * @Description:
 * @author: RZS
 * @date: 2022/9/20  17:06
 */
@Service
public class UserServiceImpl implements IUserService {

    @Autowired
    private IUserMapper userMapper;

    /**
     * 用户注册
     * @param user 用户数据
     * @return
     */
    @Override
    public Integer addUser(BasketballMallUser user) throws SportsUsernameRegisteredException, SportsUserRegException {
        // 根据用户名查询用户数据
        BasketballMallUser basketballMallUser = userMapper.selectByUsername(user.getUsername());
        // 判断查询结果，如果结果不为null，则表示该用户名已经被注册过，注册失败
        if (basketballMallUser != null) {
            // 抛出异常表示该用户名已经被注册过，注册失败
            throw new SportsUsernameRegisteredException("用户名已经被注册，注册失败");
        }
        // 结果为null，可以注册
        // 补齐数据
        user.setIsDelete(0);// 默认0-未删除
        user.setCreatedUser(user.getUsername());// 创建人
        user.setCreatedTime(new Date());// 创建时间
        user.setModifiedUser(user.getUsername());// 最后修改人
        user.setModifiedTime(new Date());// 最后修改时间

        // 生成盐值
        user.setSalt(UUID.randomUUID().toString().toUpperCase());
        // 密码加密
        user.setPassword(MD5Utils.encryptPassword(user.getSalt(), user.getPassword()));

        // 调用注册接口执行注册业务
        Integer row = userMapper.insertUser(user);

        // 判断用户数据是否注册成功
        if (row <= 0) {
            // 注册失败，抛出异常
            throw new SportsUserRegException("用户注册失败");
        }

        return row;
    }

    /**
     * 用户登录
     * @param uname 用户输入的名字
     * @param pwd 用户输入的密码
     * @return 用户数据
     */
    @Override
    public BasketballMallUser userLogin(String uname, String pwd) {
        // 1、判断用户名和密码是否为null
        if (StringUtils.isBlank(uname) || StringUtils.isBlank(pwd)) {
            // 用户名或者密码为空，抛异常
            throw new SportsUsernameOrPwdIsEmptyException("用户名或者密码为空");
        }

        // 2、调用持久层接口查询数据
        BasketballMallUser user = userMapper.selectByUsername(uname);

        // 3、判断查询结果是否为null
        if (user == null) {
            // 用户不存在，抛异常
            throw new SportsUserNotFoundException("用户不存在");
        }

        // 对用户提交的密码进行加密处理
        String encPwd = MD5Utils.encryptPassword(user.getSalt(), pwd);
        // 4、判断密码是否正确
        if (!user.getPassword().equals(encPwd)) {
            // 密码错误，抛异常
            throw new SportsWrongPasswordException("密码错误");
        }

        // 5、做脱密处理，将盐和密码设为空
        user.setPassword(null);
        user.setSalt(null);

        return user;
    }
}
